home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / term / multitos.trm < prev    next >
Text File  |  1998-12-14  |  10KB  |  401 lines

  1. /*
  2.  * $Id: $
  3.  */
  4.  
  5. /* GNUPLOT - multitos.trm */
  6.  
  7. /*[
  8.  * Copyright 1994, 1998
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the complete modified source code.  Modifications are to
  18.  * be distributed as patches to the released version.  Permission to
  19.  * distribute binaries produced by compiling modified sources is granted,
  20.  * provided you
  21.  *   1. distribute the corresponding source modifications from the
  22.  *    released version in the form of a patch file along with the binaries,
  23.  *   2. add special version identification to distinguish your version
  24.  *    in addition to the base release version number,
  25.  *   3. provide your name and address as the primary contact for the
  26.  *    support of your modified version, and
  27.  *   4. retain our contact information in regard to use of the base
  28.  *    software.
  29.  * Permission to distribute the released version of the source code along
  30.  * with corresponding source modifications in the form of a patch file is
  31.  * granted with same provisions 2 through 4 for binary distributions.
  32.  *
  33.  * This software is provided "as is" without express or implied warranty
  34.  * to the extent permitted by applicable law.
  35. ]*/
  36.  
  37. /*
  38.  * This file is included by ../term.c.
  39.  *
  40.  * This terminal driver supports:
  41.  *   mtos : ATARI Systems MiNT/MULTITOS/MAGIC with external client
  42.  *
  43.  * AUTHOR
  44.  *  Dirk Stadler (email: dirk_stadler@n.maus.de, dirk@lstm.uni-erlangen.de)
  45.  * 
  46.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  47.  * 
  48.  */
  49.  
  50. #include "driver.h"
  51.  
  52. #ifdef TERM_REGISTER
  53. register_term(mtos)
  54. #endif
  55.  
  56. #ifdef TERM_PROTO
  57.  
  58. /* function-prototypes */
  59. TERM_PUBLIC void MTOS_options(void);
  60. TERM_PUBLIC void MTOS_init(void);
  61. TERM_PUBLIC void MTOS_reset(void);
  62. TERM_PUBLIC void MTOS_graphics(void);
  63. TERM_PUBLIC void MTOS_text(void);
  64. TERM_PUBLIC void MTOS_move(unsigned int x, unsigned int y);
  65. TERM_PUBLIC void MTOS_vector(unsigned int x, unsigned int y);
  66. TERM_PUBLIC void MTOS_linetype(int lt);
  67. TERM_PUBLIC int MTOS_text_angle(int ang);
  68. TERM_PUBLIC void MTOS_put_text(unsigned int x, unsigned int y, char *str);
  69. TERM_PUBLIC int MTOS_justify_text(enum JUSTIFY mode);
  70. TERM_PUBLIC void MTOS_point(unsigned int x, unsigned int y, int number);
  71.  
  72. /* default to ST high resolution */
  73. #define MTOS_XMAX  640
  74. #define MTOS_YMAX  400
  75. #define MTOS_VCHAR 18
  76. #define MTOS_HCHAR 12
  77. #define MTOS_HTIC  5
  78. #define MTOS_VTIC  MTOS_HTIC
  79.  
  80. #define GOT_MTOS_PROTO
  81. #endif /* TERM_PROTO */
  82.  
  83. #ifndef TERM_PROTO_ONLY
  84. #ifdef TERM_BODY
  85.  
  86. #include <unistd.h>
  87. #include <fcntl.h>
  88. #include <param.h>
  89. #include <process.h>
  90. #include <signal.h>
  91. #include <support.h>
  92. #include <sys/stat.h>
  93. #include <time.h>
  94. #include <errno.h>
  95. #include <aesbind.h>
  96. #include <osbind.h>
  97. #include <mintbind.h>
  98.  
  99. int MTOS_pause(char *str);
  100. static void MTOS_quit(void);
  101. void MTOS_open_pipe(void);
  102. static void write_pid(void);
  103. static void init_exit(void);
  104.  
  105. /* commands for GPCLIENT */
  106. #define SET_GRAPHICS    'G'
  107. #define SET_TEXT        'E'
  108. #define SET_LINE        'L'
  109. #define SET_ANGLE       'A'
  110. #define SET_JUSTIFY     'J'
  111. #define SET_POINTMODE   'D'
  112. #define GR_MOVE         'M'
  113. #define GR_DRAW         'V'
  114. #define GR_RESET        'R'
  115. #define GR_TEXT         'T'
  116.  
  117. #define PAUSE           'P'
  118. #define PID             'I'
  119. #define QUIT            'Q'
  120.  
  121. /* for creating pipes */
  122. #define PIPE1           "u:\\pipe\\GPLT%d"
  123. #define PIPE2           "u:\\pipe\\gpclient.tmp"
  124. #define NAMESIZE        25
  125. #define SIZE            ((unsigned)sizeof(short))
  126.  
  127. /* default name for client */
  128. #define GPCLIENT1       "gpclient.prg"
  129. #define GPCLIENT2       "gpclient"
  130.  
  131. /* environment */
  132. #define MYENV          "GNUPLOTPATH"
  133. #define PATH           "PATH"
  134.  
  135. /* some global variables */
  136. static char MTOS_mode = 0;
  137. static int handle = -1;
  138. static int pid = -1;
  139.  
  140. TERM_PUBLIC void MTOS_options()
  141. {
  142.     term_options[0] = NUL;
  143. }
  144.  
  145. TERM_PUBLIC void MTOS_init()
  146. {
  147.     char pipe[NAMESIZE];
  148.     char *file, cmd[MAXPATHLEN+1];
  149.     char const *const ext[] = { "prg", "app", NULL };
  150.  
  151.     if (handle < 0) {
  152.     if (aesid < 0) {
  153.         if ((aesid = appl_init()) < 0)
  154.         int_error("APPL_INIT failed !", NO_CARET);
  155.     }
  156.     file = findfile(GPCLIENT2, getenv(MYENV), ext);
  157.     if (!file)
  158.         safe_strncpy(cmd, GPCLIENT1, sizeof(cmd));
  159.     else if (file && !strchr(file, '\\') && !strchr(file, '/'))
  160.         safe_strncpy(cmd, file, sizeof(cmd));
  161.     else
  162.         unx2dos(file, cmd);
  163.     if (!shel_find(cmd))
  164.         int_error("Cannot find GPCLIENT !", NO_CARET);
  165.  
  166.     sprintf(&pipe[1], PIPE1, aesid);
  167.  
  168.     if ((handle = open(&pipe[1], O_RDWR | O_CREAT)) < 0) {
  169.         if ((handle = (int) Fcreate(&pipe[1], 0)) < 0)
  170.         int_error("Cannot open PIPE to GPCLIENT !", NO_CARET);
  171.     }
  172.     pipe[0] = (char) (strlen(&pipe[1]) + 1);
  173.  
  174.     if (!shel_write(1, 1, 100, cmd, pipe)) {
  175.         close(handle);
  176.         handle = -1;
  177.         int_error("Cannot spawn GPCLIENT !", NO_CARET);
  178.     }
  179.     init_exit();
  180.     }
  181.     if (aesid > -1)
  182.     menu_register(aesid, "  Terminal: mtos");
  183. }
  184.  
  185. TERM_PUBLIC void MTOS_reset()
  186. {
  187.     short buff;
  188.  
  189.     buff = (short) GR_RESET;
  190.     write(handle, &buff, SIZE);
  191. }
  192.  
  193. TERM_PUBLIC void MTOS_text()
  194. {
  195.     short buff;
  196.  
  197.     buff = (short) SET_TEXT;
  198.     if (MTOS_mode != SET_TEXT)
  199.     write(handle, &buff, SIZE);
  200.     MTOS_mode = SET_TEXT;
  201. }
  202.  
  203. TERM_PUBLIC void MTOS_graphics()
  204. {
  205.     short buff;
  206.  
  207.     buff = (short) SET_GRAPHICS;
  208.     write(handle, &buff, SIZE);
  209.     MTOS_mode = SET_GRAPHICS;
  210. }
  211.  
  212. TERM_PUBLIC void MTOS_move(unsigned int x, unsigned int y)
  213. {
  214.     short x_1, y_1, buff;
  215.  
  216.     x_1 = (short) x;
  217.     y_1 = (short) y;
  218.     buff = (short) GR_MOVE;
  219.     write(handle, &buff, SIZE);
  220.     write(handle, &x_1, SIZE);
  221.     write(handle, &y_1, SIZE);
  222. }
  223.  
  224. TERM_PUBLIC void MTOS_vector(unsigned int x, unsigned int y)
  225. {
  226.     short x_1, y_1, buff;
  227.  
  228.     x_1 = (short) x;
  229.     y_1 = (short) y;
  230.     buff = (short) GR_DRAW;
  231.     write(handle, &buff, SIZE);
  232.     write(handle, &x_1, SIZE);
  233.     write(handle, &y_1, SIZE);
  234. }
  235.  
  236. TERM_PUBLIC void MTOS_linetype(int lt)
  237. {
  238.     short lt_1, buff;
  239.  
  240.     lt_1 = (short) lt;
  241.     buff = (short) SET_LINE;
  242.     write(handle, &buff, SIZE);
  243.     write(handle, <_1, SIZE);
  244. }
  245.  
  246. TERM_PUBLIC int MTOS_text_angle(int ang)
  247. {
  248.     short ta_1, buff;
  249.  
  250.     ta_1 = (short) ang;
  251.     buff = (short) SET_ANGLE;
  252.     write(handle, &buff, SIZE);
  253.     write(handle, &ta_1, SIZE);
  254.     return (TRUE);
  255. }
  256.  
  257. TERM_PUBLIC void MTOS_put_text(unsigned int x, unsigned int y, char *str)
  258. {
  259.     short x_1, y_1, len, buff;
  260.  
  261.     x_1 = (short) x;
  262.     y_1 = (short) y;
  263.     len = (short) strlen(str) + 1;
  264.     buff = (short) GR_TEXT;
  265.     write(handle, &buff, SIZE);
  266.     write(handle, &x_1, SIZE);
  267.     write(handle, &y_1, SIZE);
  268.     write(handle, &len, SIZE);
  269.     write(handle, str, (unsigned) len);
  270. }
  271.  
  272. TERM_PUBLIC int MTOS_justify_text(enum JUSTIFY mode)
  273. {
  274.     short j_mode, buff;
  275.  
  276.     j_mode = (short) mode;
  277.     buff = (short) SET_JUSTIFY;
  278.     write(handle, &buff, SIZE);
  279.     write(handle, &j_mode, SIZE);
  280.     return (TRUE);
  281. }
  282.  
  283. TERM_PUBLIC void MTOS_point(unsigned int x, unsigned int y, int number)
  284. {
  285.     short mode, buff;
  286.  
  287.     buff = (short) SET_POINTMODE;
  288.     mode = 1;
  289.     write(handle, &buff, SIZE);
  290.     write(handle, &mode, SIZE);
  291.     do_point(x, y, number);
  292.     mode = 0;
  293.     write(handle, &buff, SIZE);
  294.     write(handle, &mode, SIZE);
  295. }
  296.  
  297. int MTOS_pause(char *str)
  298. {
  299.     short len, buff;
  300.  
  301.     len = (short) strlen(str) + 1;
  302.     buff = (short) PAUSE;
  303.     write(handle, &buff, SIZE);
  304.     write(handle, &len, SIZE);
  305.     write(handle, str, (unsigned) len);
  306.     read(handle, &len, SIZE);
  307.     return ((int) len);
  308. }
  309.  
  310. static void MTOS_quit()
  311. {
  312.     short buff;
  313.  
  314.     if (pid > -1)
  315.     kill(pid, SIGTERM);
  316.     if (handle > -1) {
  317.     buff = (short) QUIT;
  318.     write(handle, &buff, SIZE);
  319.     close(handle);
  320.     }
  321. }
  322.  
  323. void MTOS_open_pipe()
  324. {
  325.     char pipe[NAMESIZE];
  326.     short len;
  327.  
  328.     if (handle < 0) {
  329.     if ((handle = open(PIPE2, O_RDWR)) < 0)
  330.         return;
  331.     read(handle, &len, SIZE);
  332.     if (len > 0) {
  333.         read(handle, pipe, (unsigned) len);
  334.         close(handle);
  335.         if ((handle = open(pipe, O_RDWR)) < 0) {
  336.         fprintf(stderr, "\n\n\33p Can't open Pipe: (%s) Error: (%s) !\33q\n\n", pipe,sys_errlist[errno]);
  337.         fflush(stderr);
  338.         return;
  339.         }
  340.     }
  341.     init_exit();
  342.     }
  343. }
  344.  
  345. static void write_pid()
  346. {
  347.     short buff, mypid, gpclpid;
  348.  
  349.     mypid = (short) getpid();
  350.     buff = (short) PID;
  351.     while (write(handle, &buff, SIZE) <= 0)
  352.     Fselect(100, 0L, 0L, 0L);
  353.     while (read(handle, &gpclpid, SIZE) <= 0)
  354.     Fselect(100, 0L, 0L, 0L);
  355.     write(handle, &mypid, SIZE);
  356.     pid = (int) gpclpid;
  357. }
  358.  
  359. static void init_exit()
  360. {
  361.     Cconout(7);
  362.     write_pid();
  363.     atexit(MTOS_quit);
  364. }
  365.  
  366. #endif /* TERM_BODY */
  367.  
  368. #ifdef TERM_TABLE
  369.  
  370. TERM_TABLE_START(mtos_driver)
  371.     "mtos", "Atari MiNT/MULTITOS/Magic Terminal",
  372.     MTOS_XMAX, MTOS_YMAX, MTOS_VCHAR, MTOS_HCHAR,
  373.     MTOS_VTIC, MTOS_HTIC, MTOS_options, MTOS_init, MTOS_reset,
  374.     MTOS_text, null_scale, MTOS_graphics, MTOS_move, MTOS_vector,
  375.     MTOS_linetype, MTOS_put_text, MTOS_text_angle,
  376.     MTOS_justify_text, MTOS_point, do_arrow, set_font_null,
  377.     0, TERM_CAN_MULTIPLOT, 0, 0
  378. TERM_TABLE_END(mtos_driver)
  379.  
  380. #undef LAST_TERM
  381. #define LAST_TERM mtos_driver
  382.  
  383. #endif /* TERM_TABLE */
  384.  
  385. #endif /* TERM_PROTO_ONLY */
  386.  
  387. #ifdef TERM_HELP
  388. START_HELP(mtos)
  389. "1 mtos",
  390. "?commands set terminal mtos",
  391. "?set terminal mtos",
  392. "?set term mtos",
  393. "?terminal mtos",
  394. "?term mtos",
  395. "?mtos",
  396. " The `mtos` terminal has no options.  It sends data via a pipe to an external",
  397. " program called GPCLIENT.  It runs under MULTITOS, Magic 3.x, MagicMAC. and",
  398. " MiNT.  If you cannot find GPCLIENT, than mail to dirk@lstm.uni-erlangen.de."
  399. END_HELP(mtos)
  400. #endif /* TERM_HELP */
  401.